package org.fujay.langchain4jserver.infrastructure.persistence.mybatis.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.fujay.langchain4jserver.infrastructure.persistence.mybatis.entity.AppUsageStatsPo;

import java.time.LocalDate;
import java.util.List;

/**
 * 应用用量统计 Mapper 接口
 */
@Mapper
public interface AppUsageStatsMapper extends BaseMapper<AppUsageStatsPo> {

    /**
     * 增加用量统计 (原子操作)
     *
     * @param appId            应用ID
     * @param statDate         统计日期
     * @param callCount        增加的调用次数
     * @param promptTokens     增加的Prompt Tokens
     * @param completionTokens 增加的Completion Tokens
     * @param embeddingTokens  增加的Embedding Tokens
     */
    void incrementUsageStats(
            @Param("appId") Long appId,
            @Param("statDate") LocalDate statDate,
            @Param("callCount") Integer callCount,
            @Param("promptTokens") Long promptTokens,
            @Param("completionTokens") Long completionTokens,
            @Param("embeddingTokens") Long embeddingTokens);

    /**
     * 根据应用ID和日期查询单条统计记录
     *
     * @param appId    应用ID
     * @param statDate 统计日期
     * @return 统计记录PO，如果不存在则返回null
     */
    AppUsageStatsPo selectByAppIdAndDate(
            @Param("appId") Long appId, @Param("statDate") LocalDate statDate);

    /**
     * 根据应用ID和日期范围查询统计记录列表
     *
     * @param appId     应用ID
     * @param startDate 开始日期 (包含)
     * @param endDate   结束日期 (包含)
     * @return 统计记录PO列表
     */
    List<AppUsageStatsPo> selectByAppIdAndDateRange(
            @Param("appId") Long appId,
            @Param("startDate") LocalDate startDate,
            @Param("endDate") LocalDate endDate);

    /**
     * 根据应用ID删除所有统计记录
     *
     * @param appId 应用ID
     * @return 删除的记录数
     */
    int deleteByAppId(Long appId);
}
